UNIDAD 6: Excepciones y Errores en Java

En Java es habitual confundir excepciones con errores.

Excepciones en Java

Las excepciones suelen identificar eventualidades "gestionables", dicho de otro modo, problemas que se presentan en la ejecución normal de nuestro sistema y que pueden lanzarse y capturarse libremente en beneficio del propio sistema informático más allá del desarrollo (en producción).

Errores en Java

Los errores son un tipo de excepción que se diferencia de las excepciones "normales" en que nuestras aplicaciones no deberían intentar gestionarlas de la manera habitual (mediante uso de bloques try catch).
Los errores son habitualmente problemas "críticos". Por ejemplo en lo referente a la gestión y errores en las llamadas a métodos que se detectan en tiempo de ejecución (NoSuchMethodError) y todo tipo de eventualidades que deben resolverse de manera directa e inmediata durante el desarrollo del sistema.

Introducción

Como no todos los errores pueden ser detectados durante la compilación • Los problemas tienen que ser tratados en tiempo de ejecución a través de algún mecanismo que permita al originador del error pasar información apropiada a un recipiente que sabrá cómo tratarla. En C y en otros lenguajes no Orientados a Objetos, se retorna un valor especial cada vez que se llama a un método. • Esto se ha demostrado que es inviable porque el código de un programa se alarga en exceso al estar comprobando si el valor de retorno nos está indicando si ha habido algún error o no. Una condición excepcional es un problema que le impide continuar al método con la siguiente instrucción porque no tiene la información necesaria para poder evaluar el problema en el contexto actual • Todo lo que se puede hacer es salir del contexto inmediatamente y delegar el problema a un contexto superior.

Jerarquía de las excepciones

Esta es la jerarquía de las Clases de la librería estándar del lenguaje Java que tratan las excepciones

• Throwable
Es la Superclase de todos los errores y excepciones en Java

• Error
Define los errores que no se suelen capturar en los programas en condiciones normales esta Subclase la utiliza el entorno de ejecución Java como respuesta a errores de tipo catastrófico de hardware que no suelen ser gestionadas por los programas

• Exception
Es la Superclase de todas las Subclases que tratan errores y excepciones estas Subclases pueden ser parte de las librerías del lenguaje Java o Subclases que hemos creado nosotros especialmente para que traten errores y excepciones inherentes a nuestras aplicaciones ClassNotFoundException
Esta Subclase está incluida en el lenguaje Java y entra en funcionamiento cuando el entrono de ejecuación Java no encuentra una Clase
CanalNegativoException
Esta Subclase la crearemos más adelante para gestionar las posibles entradas de canales con valor negativo a la aplicación de los televisores
RuntimeException
Tienen una operativa diferente del resto de las expeciones que ya comentaremos más adelante
NumberFormatException
Esta Subclase se utiliza para indicar que la aplicación ha intentado convertir un String a un Objeto de tipo numérico pero el String no tenía el formato
apropiado
IndexOutOfBoundsException esta Subclase se Utiliza para indicar que la aplicación ha encontrado un indice de una matriz o de un vector fuera de rango.

Los bloques try, catch y finally

Los bloques try, catch y finally. Esta es la forma general de un bloque de gestión de excepciones:

• try

Esta cláusula se utiliza para protegernos de los posibles errores de ejecución y poder gestionarlos lo único que tenemos que hacer es escribir el código que queremos controlar dentro de un bloque try si ocurriera una excepción en este bloque, esta se lanzaría y el control del programa se transferiría desde este bloque try al bloque catch

• catch (Excepción1 e1) {
Esta cláusula especifica el tipo de excepción que se desea capturar
• catch (Excepción2 e2) {
En algunos casos, la misma secuencia de código puede activar más de un tipo de excepción para gestionar este tipo de situaciones, se pueden especificar dos más clausulas catch, cada una para capturar un tipo distinto de excepción cuando se lanza una excepción, el entorno de ejecución Java inspecciona por orden las sentencias catch y ejecuta la primera que coincide con el tipo de excepción que se ha producido después de ejecutar una sentencia catch, no se ejecuta ninguna de las sentencias catch restantes y se continúa la ejecución del programa fuera de los bloques try/catch.

• finally { Este bloque se ejecuta tanto si se lanza una excepción como si no se lanza si por ejemplo queremos conversar con una Base de Datos tanto si han ido bien todos los pasos de la conversación como si alguno de los pasos ha fallado, querremos que la conexión con la Base de Datos siempre se cierre para que siempre se cumpla este hecho, la desconexión con la Base de datos tiene que estar implementada dentro del bloque finally

La sentencia throws

Si la invocación de un método en un contexto concreto es susceptible de lanzar una excepción que no podamos manejar, se deberá especificarlo de alguna forma que queremos delegar el tratamiento de la excepción a un contexto superior esto se realiza incluyendo una cláusula throws en la declaración del método una cláusula throws lista los tipos de excepciones que un método puede lanzar

La cláusula throws es obligada para todas las excepiones excepto aquellas que hereden de la Clase RuntimeException es decir no estamos obligados a tratar las excepciones que heredan de la Clase RuntimeException un ejemplo de excepción que hereda de RuntimeException es NumberFormatException que se utiliza cuando queremos realizar conversiones de Objetos de tipo String a números enteros si los valores del String los tomamos por ejemplo de una Base de datos no hace falta que tratemos la excepción porque estamos seguros que los datos son correctos pero si estos datos los introduce un ususario por ejemplo en un campo de texto es altamente recomendable que nos protejamos ante un posible error de entrada de datos cabe la posibilidad de que el usuario en vez de introducir un número en el campo de texto , nos introduzca una letra

Esta es la forma general de la decalración de un método que incluye una cláusula throws